package com.xrh.xdemo.api.dto.extend;

import java.io.Serializable;
import java.util.List;
import java.util.Set;

import com.xrh.xdemo.api.constants.LoginConstants;
import com.xrh.xdemo.api.dto.entity.SysUserDTO;
import com.xrh.xdemo.api.enums.SysRoleEnum;

import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.collection.CollUtil;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

@Data
public class SysUserDetailDTO extends SysUserDTO  implements Serializable {

	private static final long serialVersionUID = 1L;
    
	@ApiModelProperty("用户拥有的角色信息集合")
	private List<RoleInfoDTO> roleInfoList;
	
	@ApiModelProperty("有权限的菜单编号集合")
	private Set<String> menuNos;
	
	@ApiModelProperty("有权限的接口地址集合")
	private Set<String> menuUrls;
	
	/**
	 * @function 是否是超级管理员
	 * @author 肖荣辉
	 * @date 2023年12月8日
	*/
	public boolean isAdmin() {
		return LoginConstants.JWT_LOGIN_SYS_ACCOUNT_ID.equals(getId());
	}

	/**
	 * @function 判断用户是否指定角色中的其中一个角色
	 * @param roleEnums
	 * @author 肖荣辉
	 * @date 2023年12月17日
	*/
	public boolean hasAnyRole(SysRoleEnum... roleEnums) {
		
		if(isAdmin()) return true;
		
		if(CollUtil.isEmpty(roleInfoList)) return false;
		
		if(roleEnums == null || roleEnums.length == 0)
			return false;
		
		Set<String> roleNos = CollStreamUtil.toSet(roleInfoList, RoleInfoDTO::getRoleNo);
		
		for(SysRoleEnum item : roleEnums) {
			
			if(roleNos.contains(item.name()))
				return true;
			
		}
		
		return false;
	}
	
	/**
	 * @function 判断用户是否指定角色中的其中一个角色
	 * @param roleEnums
	 * @author 肖荣辉
	 * @date 2023年12月17日
	*/
	public boolean hasAnyRole(String... roleNos) {
		
		if(isAdmin()) return true;
		
		if(CollUtil.isEmpty(roleInfoList)) return false;
		
		if(roleNos == null || roleNos.length == 0)
			return false;
		
		Set<String> userRoleNos = CollStreamUtil.toSet(roleInfoList, RoleInfoDTO::getRoleNo);
		
		for(String item : roleNos) {
			
			if(userRoleNos.contains(item))
				return true;
			
		}
		
		return false;
	}
	
	/**
	 * @function 判断是否有接口权限
	 * @param uri
	 * @author 肖荣辉
	 * @date 2023年12月21日
	*/
	public boolean hasInterfacePermission(String uri) {
		
		if(CollUtil.isEmpty(getMenuUrls()))
			return false;
		
		return getMenuUrls().contains(uri);
		
	}
	
}
